#include <iostream>
#include <cstdlib>
#include <unistd.h>

bool GetQueryString(std::string& query_string)
{
    bool result = false;
    std::string method = getenv("METHOD");
    
    if(method == "GET")
    {
        query_string = getenv("QUERY_STRING");
        // std::cerr << "Debug QUERY_STRING: " << query_string << std::endl;
        result = true;
    }
    else if(method == "POST")
    {
        // CGI要知道从标准输入读取多少个字节
        // std::cerr << "Content-Length: " << getenv("CONTENT_LENGTH") << std::endl;
        int content_length = atoi(getenv("CONTENT_LENGTH"));
        char c = 0;
        while(content_length)
        {
            read(0, &c, 1);
            query_string.push_back(c);
            content_length--;
        }
        // std::cerr << "Post Debug recv data: " << query_string << std::endl;
        result = true;
    }
    else
    {
        result = false;
    }
    return result;
}

// 分割字符串
void CutString(std::string& target, std::string sep, std::string& out1, std::string& out2)
{
    auto pos = target.find(sep);
    if(pos != std::string::npos)
    {
        // 有这一个字符
        out1 = target.substr(0, pos);
        out2 = target.substr(pos+sep.size());
    }
}

int main()
{
    std::string query_string;       // 我们接收到的所有信息（要处理的数据）
    GetQueryString(query_string);
    // a=100&v=200
    // std::cerr << "--------------------------" << std::endl;
    // 处理接受得到的信息
    std::string str1;
    std::string str2;
    CutString(query_string, "&", str1, str2);
    // str1: a=100；str2:v=200
    
    // 再次切分=，获取数字信息
    std::string name1;
    std::string value1;
    CutString(str1, "=", name1, value1);
    std::string name2;
    std::string value2;
    CutString(str2, "=", name2, value2);
    // name1:a；value1:100  ；name2:v；value2:200

    // 1号文件描述符（将信息发送给管道上）
    std::cout << name1 << " : " << value1 << std::endl;
    std::cout << name2 << " : " << value2 << std::endl;

    // 2号文件描述符（将信息发送到终端上）
    std::cerr << name1 << " : " << value1 << std::endl;
    std::cerr << name2 << " : " << value2 << std::endl;

    return 0;
    
}